XCP-ng
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    New install - Login screen blank

    Scheduled Pinned Locked Moved Xen Orchestra
    14 Posts 6 Posters 356 Views 4 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D Offline
      DustinB @raider600
      last edited by

      @raider600 I've seen the same login screen from time to time where it doesn't look correct.

      I've rebooted the system to address the issue and it's always come up successfully.

      R 1 Reply Last reply Reply Quote 0
      • R Offline
        raider600 @olivierlambert
        last edited by

        @olivierlambert Thank you. I believe I found the server logs... I dont know where to find the build logs.

        Node - v22.14.0
        npm - 10.9.2

        #!/usr/bin/env node
        import appConf from 'app-conf';
        import execPromise from 'exec-promise';
        import get from 'lodash/get.js';
        import highland from 'highland';
        import levelup from 'level-party';
        import ndjson from 'ndjson';
        import parseArgs from 'minimist';
        import sublevel from 'subleveldown';
        import util from 'util';
        import { forEach } from './utils.mjs';
        import globMatcher from './glob-matcher.mjs';
        const getLogs = (db, args) => {
          let stream = highland(db.createReadStream({
            reverse: true
          }));
          if (args.since) {
            stream = stream.filter(({
              value
            }) => value.time >= args.since);
          }
          if (args.until) {
            stream = stream.filter(({
              value
            }) => value.time <= args.until);
          }
          const fields = Object.keys(args.matchers);
          if (fields.length > 0) {
            stream = stream.filter(({
              value
            }) => {
              for (const field of fields) {
                const fieldValue = get(value, field);
                if (!args.matchers[field](fieldValue)) {
                  return false;
                }
              }
              return true;
            });
          }
          return stream.take(args.limit);
        };
        const deleteLogs = (db, args) => new Promise(resolve => {
          let nDeleted = 0;
          let nRunning = 1;
          const cb = () => {
            if (--nRunning === 0) {
              console.log(nDeleted.toLocaleString(), 'deleted entries');
              resolve();
            }
          };
          const deleteEntry = key => {
            ++nDeleted;
            ++nRunning;
            db.del(key, cb);
          };
          getLogs(db, args).each(({
            key
          }) => {
            deleteEntry(key);
          }).done(cb);
        });
        const GC_KEEP = 2e4;
        const gc = (db, args) => new Promise((resolve, reject) => {
          let keep = GC_KEEP;
          let count = 1;
          const cb = () => {
            if (--count === 0) {
              resolve();
            }
          };
          const stream = db.createKeyStream({
            reverse: true
          });
          const deleteEntry = key => {
            ++count;
            db.del(key, cb);
          };
          let onData = keep !== 0 ? () => {
            if (--keep === 0) {
              stream.removeListener('data', onData);
              onData = deleteEntry;
              stream.on('data', onData);
            }
          } : deleteEntry;
          const onEnd = () => {
            console.log('end');
            removeListeners();
            cb();
          };
          const onError = error => {
            console.log('error');
            removeListeners();
            reject(error);
          };
          const removeListeners = () => {
            stream.removeListener('data', onData).removeListener('end', onEnd).removeListener('error', onError);
          };
          stream.on('data', onData).on('end', onEnd).on('error', onError);
        });
        async function printLogs(db, args) {
          let stream = getLogs(db, args);
          if (args.json) {
            stream = highland(stream.pipe(ndjson.stringify())).each(value => {
              process.stdout.write(value);
            });
          } else {
            stream = stream.each(value => {
              console.log(util.inspect(value, {
                depth: null
              }));
            });
          }
          return new Promise(resolve => {
            stream.done(resolve);
          });
        }
        function helper() {
          console.error(`
        xo-server-logs --help, -h
        
            Display this help message.
        
        xo-server-logs [--json] [--limit=<limit>] [--since=<date>] [--until=<date>] [<pattern>...]
        
            Prints the logs.
        
            --json
              Display the results as new line delimited JSON for consumption
              by another program.
        
            --limit=<limit>, -n <limit>
              Limit the number of results to be displayed (default 100)
        
            --since=<date>, --until=<date>
              Start showing entries on or newer than the specified date, or on
              or older than the specified date.
        
              <date> should use the format \`YYYY-MM-DD\`.
        
            <pattern>
              Patterns can be used to filter the entries.
        
              Patterns have the following format \`<field>=<value>\`, \`<field>\` or \`!<field>\`.
        
        xo-server-logs --gc
        
            Remove all but the ${GC_KEEP}th most recent log entries.
        
        xo-server-logs --delete <predicate>...
        
            Delete all logs matching the passed predicates.
        
            For more information on predicates, see the print usage.
        
        xo-server-logs --repair
        
            Repair/compact the database.
        
            This is an advanced operation and should be used only when necessary and offline (xo-server should be stopped).
        `);
        }
        function getArgs() {
          const stringArgs = ['since', 'until', 'limit'];
          const args = parseArgs(process.argv.slice(2), {
            string: stringArgs,
            boolean: ['delete', 'help', 'json', 'gc', 'repair'],
            default: {
              limit: 100,
              json: false,
              help: false
            },
            alias: {
              limit: 'n',
              help: 'h'
            }
          });
          const patterns = {};
          for (let value of args._) {
            value = String(value);
            const i = value.indexOf('=');
            if (i !== -1) {
              const field = value.slice(0, i);
              const pattern = value.slice(i + 1);
              const fieldPatterns = patterns[field];
              if (fieldPatterns === undefined) {
                patterns[field] = [pattern];
              } else if (Array.isArray(fieldPatterns)) {
                fieldPatterns.push(pattern);
              } else {
                throw new Error('cannot mix existence with equality patterns');
              }
            } else {
              const negate = value[0] === '!';
              if (negate) {
                value = value.slice(1);
              }
              if (patterns[value]) {
                throw new Error('cannot mix existence with equality patterns');
              }
              patterns[value] = !negate;
            }
          }
          const mustExists = value => value !== undefined;
          const mustNotExists = value => value === undefined;
          args.matchers = {};
          for (const field in patterns) {
            const values = patterns[field];
            args.matchers[field] = values === true ? mustExists : values === false ? mustNotExists : globMatcher(values);
          }
          forEach(stringArgs, arg => {
            if (args[arg] instanceof Array) {
              throw new Error(`error: too many values for ${arg} argument`);
            }
          });
          ['since', 'until'].forEach(arg => {
            if (args[arg] !== undefined) {
              args[arg] = Date.parse(args[arg]);
              if (isNaN(args[arg])) {
                throw new Error(`error: bad ${arg} timestamp format`);
              }
            }
          });
          if (isNaN(args.limit = +args.limit)) {
            throw new Error('error: limit is not a valid number');
          }
          return args;
        }
        execPromise(async function main() {
          const args = getArgs();
          if (args.help) {
            helper();
            return;
          }
          const config = await appConf.load('xo-server', {
            appDir: new URL('..', import.meta.url).pathname,
            ignoreUnknownFormats: true
          });
          if (args.repair) {
            const require = (await import('module')).createRequire(import.meta.url);
            const {
              repair
            } = require(require.resolve('level', {
              paths: [require.resolve('level-party')]
            }));
            await new Promise((resolve, reject) => {
              repair(`${config.datadir}/leveldb`, error => {
                if (error) {
                  reject(error);
                } else {
                  resolve();
                }
              });
            });
            return;
          }
          const db = sublevel(levelup(`${config.datadir}/leveldb`, {
            valueEncoding: 'json'
          }), 'logs', {
            valueEncoding: 'json'
          });
          return args.delete ? deleteLogs(db, args) : args.gc ? gc(db) : printLogs(db, args);
        });
        //# sourceMappingURL=logs-cli.mjs.map
        
        1 Reply Last reply Reply Quote 0
        • R Offline
          raider600 @DustinB
          last edited by

          @DustinB Ive restarted a few times though no dice. It's almost like something isnt unpacking or running. 😞

          D 1 Reply Last reply Reply Quote 0
          • D Offline
            DustinB @raider600
            last edited by

            @raider600 said in New install - Login screen blank:

            @DustinB Ive restarted a few times though no dice. It's almost like something isnt unpacking or running. 😞

            In the URL does it show /v6 at the tail end?

            R 1 Reply Last reply Reply Quote 0
            • R Offline
              raider600 @DustinB
              last edited by raider600

              @DustinB said in New install - Login screen blank:

              @raider600 said in New install - Login screen blank:

              @DustinB Ive restarted a few times though no dice. It's almost like something isnt unpacking or running. 😞

              In the URL does it show /v6 at the tail end?

              Im just using the ip address. no https either. So no i dont think it has a v6 at the end. but im also not 100% sure i know what you mean. lol

              P 1 Reply Last reply Reply Quote 0
              • P Offline
                ph7 @raider600
                last edited by

                @raider600
                I also had this issue some week ago
                Unfortunately I don't remember what I did to fix it.
                But I would try the --force option

                I am running XO as root

                sudo su -
                cd ~/xen-orchestra/
                git checkout .
                git pull --ff-only
                yarn
                yarn build --force
                yarn run turbo run build --filter @xen-orchestra/web
                systemctl restart xo-server.service
                cd

                R 1 Reply Last reply Reply Quote 0
                • R Offline
                  raider600 @ph7
                  last edited by

                  @ph7 Thanks for that. but it didnt work. funny when trying to restart the xo-server.service it fails and says service not found. Im only trying to get it to run with yarn start in the packages/xo-server dir. Here is a screen shot of the networking tab in the developer window of the browser. looks like its missing some stuff. hah
                  66293d17-d63f-4d3f-8df7-5f68f85ab95c-image.png

                  DanpD 1 Reply Last reply Reply Quote 0
                  • DanpD Online
                    Danp Pro Support Team @raider600
                    last edited by

                    @raider600 The xo-server.service doesn't exist unless you create in yourself when using XO from sources. XOA takes care of this for you.

                    R 1 Reply Last reply Reply Quote 0
                    • R Offline
                      raider600 @Danp
                      last edited by

                      @Danp Well I dont think I ever got to that step. haha. This is bumming me out. I want to use XOA. But I need proof of concept before we buy it.

                      DanpD nick.lloydN 2 Replies Last reply Reply Quote 0
                      • DanpD Online
                        Danp Pro Support Team @raider600
                        last edited by

                        @raider600 You can always go to https://vates.tech/deploy and install XOA, then start a free trial to perform your POC. 😉

                        1 Reply Last reply Reply Quote 0
                        • nick.lloydN Offline
                          nick.lloyd @raider600
                          last edited by

                          @raider600 To piggyback off of DanP, they've been very good about extending our trial while we were evaluating our options to migrate off of VMware!

                          1 Reply Last reply Reply Quote 0
                          • R Offline
                            raider600
                            last edited by

                            This is solved. What I ended up doing was installing ubuntu and doing the whole install as root. Thanks for the help, I hope I can use XOA in the future!

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post