LINUX.ORG.RU

Сообщения constin

 

Flask обновить объект в форме

Форум — Development

Привет.

Есть форма запроса, в ней есть поля, которые она забирает из ldap. Например, список общих почтовых ящиков (mail_boxes), к которым пользователь должен получить доступ. Но если я в ldap добавляю новый ящик, который должен отображаться в форме, то он появляется только если перезапустить приложение.

Те есть класс UserForm и его переменные не обновляются при запросе. Как бы их насильно обновлять?

models.py

class UserForm(FlaskForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)


    mail_boxes = Select2MultipleField(u"Zugriff auf Mailkonto", [],
            choices=get_mail_boxes(),
            description=u"X2",
            render_kw={"multiple": "multiple"})



#views.py




@request_new_user.route('/', methods= ["GET", "POST"])
@roles_accepted('control_admin', 'control_create_user')
@login_required
def request_form():
    
    form = UserForm()

    if form.validate_on_submit(): 
        form_data = {}
        for key in request.form.keys():
            values = request.form.getlist(key)
            if len(values) == 1:
                form_data[key] = values[0]
            else:
                form_data[key] = values

        form_data = format_form_data(form_data)
        return render_template('result.html', form_data=form_data)
    return render_template('form.html', form=form , title='Anforderung zum Anlegen eines neuen Benutzers' )

#form.html






                                {{ form.mail_boxes.label }}
                                {{ form.mail_boxes(class_="form-control") }}      
...

                          

                            <script type="text/javascript">document.addEventListener("DOMContentLoaded", function () {
                                $("#mail_boxes").select2();
                            });

#models.py

def get_mail_boxes():

    search_base = 'cn=users,dc=xxx,dc=com'
    search_filter = '(&(uid=mail_*))'
    attr = ['mailPrimaryAddress', 'uid']
    conn = get_bound_connection()
    conn.search(search_base, search_filter, attributes=attr)
    if len(conn.entries) < 1:
        return False

    result = []
    for item in conn.entries:
        mail = getattr(item, 'mailPrimaryAddress', False)[0]
        uid = getattr(item, 'uid', False)[0]
        result.append(tuple((uid, mail)))
    return result


 ,

constin
()

Размышления по поводу ldap юзеров в python

Форум — Development

Какую бы документацию или мануал по интегрированию ldap юзеров в flask я не открыл, она всегда сводится к тому, чтобы один раз при авторизации забрать слепок юзера с ldap и запухнуть его куда-нибудь в другую базу данных , будь то sql или словарь или еще что-то.

Если почитать мой прошлый пост, то у меня были проблемы с uswgi воркерами. Каждый из них требовал отдельной авторизации одного и того же юзера. И решением было сохранять юзера в sql.

Сама концепция этого довольно костыльная. У меня есть open-ldap, а я кеширую юзеров в другое место. Но так же это приведет к лагам между изменением в open-ldap и реакции приложения на эти изменения:

Допустим у меня есть роут

@app.route('/test')
@role_required('admin')
def test():
  return "ldap admin access"

роль 'admin' это принадлежность юзера к группе в ldap, но я ее кеширую вместе с юзером в sql. И выходит, что когда я исключу юзера из этой группы в ldap, его кешированная копия в приложении все равно будет иметь доступ к этому маршруту.

А ведь мне нужен максимально быстрый отклик на такие изменения. И вот уже я переписываю врапер @role_required, чтобы он опрашивал ldap в реальном времени.

Но почему я не могу просто и сразу прямо использовать ldap в качестве базы юзеров? без sql или каких-то костылей?

Или как мне очищать sql от юзеров по таймауту?

 ,

constin
()

flask через uwsgi теряет сессию залогиненого юзера если много uwsgi процессов.

Форум — Development

Привет.

Запускаю flask через uwsgi, авторизация пользователя через ldap, с UserMixin.

Если в конфиге uwsgi количество процессов больше одного ( у меня 5), то похоже, что каждый процесс требует, чтобы пользователь залогинился именно в нем.

Те я логинюсь и меня переносит на страницу с @flask_login.login_required. Затем я для теста обновляю страницу и с какой-то вероятностью меня вышибает назад, так как юзер не залогинен. Но если провести эту итерацию 5-8 раз, то все начинает работать хорошо.

Если же уменьшить количество процессов uwsgi до одного, то все сразу работает как часы.

 , ,

constin
()

lxd zfs сожрал место

Форум — Admin

Привет, lxd сожрал место в моей песочнице. совокупный объем данных контейнеров 4.80G , объем сожраного места 17.6G.

Снепшотов контейнеров нет, снепшотов zfs нет

По моим расчетам оно должно скушать пустой имидж от ubuntu 18 плюс то, что наизменяли контейнеры.

root@sdf:~# zfs list
NAME                                                                          USED  AVAIL  REFER  MOUNTPOINT
zfs                                                                          17.6G  1.61G    24K  none
zfs/containers                                                               4.80G  1.61G    24K  none
zfs/containers/git                                                            677M  1.61G  1.60G  /var/snap/lxd/common/lxd/storage-pools/zfs/containers/git
zfs/containers/mail                                                          1.95G  1.61G  5.72G  /var/snap/lxd/common/lxd/storage-pools/zfs/containers/mail
zfs/containers/nginx                                                          268M  1.61G   998M  /var/snap/lxd/common/lxd/storage-pools/zfs/containers/nginx
zfs/containers/seafile                                                       1.92G  1.61G  4.11G  /var/snap/lxd/common/lxd/storage-pools/zfs/containers/seafile
zfs/custom                                                                     24K  1.61G    24K  none
zfs/custom-snapshots                                                           24K  1.61G    24K  none
zfs/deleted                                                                    48K  1.61G    24K  none
zfs/deleted/images                                                             24K  1.61G    24K  none
zfs/images                                                                   12.2G  1.61G    24K  none
zfs/images/59d25aabc614ab51c0cd935d0064087b09ae57cd6aa617d06b6337dccd04a4a0  6.55G  1.61G  6.55G  none
zfs/images/9e3f0c60bacc14576c5765b4cb2b5777330dc25b955f04f2bac3721b5f38b5f2   994M  1.61G   994M  none
zfs/images/b9545f01667a09e59ec668e3f6ba5ccee6aaa4690a4d9e33403ef66e23961e6e  1.43G  1.61G  1.43G  none
zfs/images/e2dab92d3ed16585cf17634c23a465b35c729a58c0b492373e8a2c866b50788e  3.28G  1.61G  3.28G  none
zfs/share                                                                     615M  1.61G    24K  none
zfs/share/sdf                                                              615M  1.61G   615M  /zfs/share/sdf
zfs/snapshots                                                                  24K  1.61G    24K  none

root@sdf:~# lxc image list
+-------+--------------+--------+--------------------------------------+--------+-----------+-----------+-------------------------------+
| ALIAS | FINGERPRINT  | PUBLIC |             DESCRIPTION              |  ARCH  |   TYPE    |   SIZE    |          UPLOAD DATE          |
+-------+--------------+--------+--------------------------------------+--------+-----------+-----------+-------------------------------+
| git   | b9545f01667a | no     | Ubuntu 18.04 LTS server (20190529)   | x86_64 | CONTAINER | 412.69MB  | Jul 10, 2019 at 9:39am (UTC)  |
+-------+--------------+--------+--------------------------------------+--------+-----------+-----------+-------------------------------+
| mail  | 59d25aabc614 | no     | Ubuntu 18.04 LTS server (20190627.1) | x86_64 | CONTAINER | 2497.76MB | Jul 10, 2019 at 10:23am (UTC) |
+-------+--------------+--------+--------------------------------------+--------+-----------+-----------+-------------------------------+
| nginx | 9e3f0c60bacc | no     | Ubuntu 18.04 LTS server (20190529)   | x86_64 | CONTAINER | 320.05MB  | Jul 10, 2019 at 9:35am (UTC)  |
+-------+--------------+--------+--------------------------------------+--------+-----------+-----------+-------------------------------+
| sea   | e2dab92d3ed1 | no     | Ubuntu 18.04 LTS server (20190627.1) | x86_64 | CONTAINER | 1605.87MB | Jul 10, 2019 at 10:26am (UTC) |
+-------+--------------+--------+--------------------------------------+--------+-----------+-----------+-------------------------------+
root@sdf:~#  zpool status
  pool: zfs
 state: ONLINE
  scan: scrub repaired 0B in 0h3m with 0 errors on Thu Oct 10 12:44:09 2019
config:

	NAME                       STATE     READ WRITE CKSUM
	zfs                        ONLINE       0     0     0
	  scsi-0HC_Volume_2876945  ONLINE       0     0     0

errors: No known data errors

root@sdf:~# zpool history zfs
History for 'zfs':
2019-07-10.11:08:22 zpool create zfs /dev/disk/by-id/scsi-0HC_Volume_2876945

 , ,

constin
()

Flask , AJAX Вернуть данные формы на туже страницу.

Форум — Web-development

Хочу вывести результаты ввода формы на тот же темплейт , не перегружая страницу. Я долго мучался, прежде чем написать сюда. Частично оно даже работает, но есть вопросы и они внизу под кодом.

@app.route('/', methods= ["GET", "POST"])
def homepage():
    form = LoginForm()
    if request.method == 'POST':
        story = request.form.get('story')
        username = request.form.get('username')
        if story:
            result = story + username
            return jsonify(result=result)
        else:
            return jsonify(result='Input needed')

    return render_template('return.html', form=form)
class LoginForm(FlaskForm):

    username = StringField('username')

<body>
        <div class='container'>
            <form>


                    <div class="col-md-3">
                            <div class="form-group">
                                {{ form.username.label }}
                                {{ form.username(class_="form-control") }}
                            </div>
                    </div>


                <input class="form-control" id="story" name="story" type="text" value="">
                <br>
                <p>{{ form.submit(class_="btn btn-primary") }}</p>
                <a href=# id=submit><button class='btn btn-primary'>Submit</button></a>
            </form>
            <br>
            <p><h2 align='center'>Result:</h2><h2 id=result align='center'></h2></p>
        </div>

        <script src="//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script type=text/javascript>
            $(function() {
              $('a#submit').bind('click', function() {
                $.post('/', {
                  story: $('input[name="story"]').val(),
                  username: $('input[name="username"]').val(),
                }, function(data) {
                  $('#result').text(data.result);
                });
                return false;
              });
            });
        </script>

Два вопроса.

1. При генерации html у меня соответственно две кнопки

<input class="btn btn-primary" id="submit" name="submit" type="submit" value="Submit"></p>

и

                <a href=# id=submit><button class='btn btn-primary'>Submit</button></a>

Вторая кнопка работает нормально и по ней ajax возвращает данные формы на ту же страницу. А первая нет. Первая выдает

«GET /?username=&story=&submit=Submit HTTP/1.1» 200 те GET запрос.

но если в роуте вместо if request.method == 'POST', я использую if form.validate_on_submit(): , то вторая тоже перестает работать. Хотелось бы использовать form.validate_on_submit(): и отдавать ввод формы обратно на тот же темплейт.

Второй вопрос. Мне обязательно надо перечислять все переменные в ajax скрипте? может я могу как-то забрать их все сразу вместе?

Этот тестовый код, который я вымучил за пару дней. Может быть можно сделать все красивее , я был бы очень рад как пояснениям, так и правильным примерам к задаче.

 , ,

constin
()

lxd проброс портов lxc config device add proxy

Форум — Admin

Вот эта чудесная команда

lxc config device add mail-server 25  proxy listen=tcp:0.0.0.0:25 connect=tcp:localhost:25

«пробросит» 25 порт таким образом, что любой коннект из инета на lxc с именем mail-server по 25 порту будет приходить не с инетовского ip , а с 127.0.0.1, что очень мило, ибо практически всегда у postfix в mynetworks прописан 127.0.01, а mynetworks соответственно прописан в качестве исключения ко всем правилам и «здравствуй OpenRelay!» и «добро пожаловать в спам базы!» и хрен отмоешься.

Это актуально не только для smtp , на любом сервисе с таким «пробросом» ты будешь видеть в логах только 127.0.0.1

Тем не менее изначальная идея неплоха, потому что по умолчанию контейнеры висят под DHCP и чтобы сделать iptables динамическими придется изобретать костыли.

Вопрос: а умеет ли эта поделка от LXD показывать нормальный IP? Может я что-то упустил, и есть еще какой-нибудь хитрый флаг?

 , ,

constin
()

Вопрос про архитектуру кода.

Форум — Development

есть у меня 4 функции.

Первая запрашивает ldap и отдает словарь.

Вторая запрашивает ldap, а так же использует словарь от первой функции и отдает словарь.

Третья запрашивает ldap, использует и редактирует (добавляет данные) словари от первых двух функций и тоже отдает словарь.

И, наконец, четвертая использует вообще все словари , чтобы составить итоговый словарь, который потом будет использоваться для шаблонов flask.

И поскольку все так перемешанно, то словари я делаю глобальными.

И я понимаю, что это очень рукожопно, но не понимаю, как сделать так, чтобы было красиво.

Пихать все в одну функцию?

 , ,

constin
()

python ldap + flask конфликтуют?

Форум — Development

Привет.

у меня есть скрипит, к которому я захотел прикрутить flask.

У нем есть функция


import ldap
...
...

def ldap_connection_init():

    connect = ldap.initialize('ldap://{}:{}'.format(LDAP_IP, LDAP_PORT)
    connect.set_option(ldap.OPT_REFERRALS, 0)
    connect.simple_bind_s(LDAP_USER,LDAP_PASSWORD)
    return connect

И когда я дописываю в скрипт

from flask import Flask, render_template

...

app = Flask(__name__)

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

то питон начинает ругаться на connect.set_option

   4091e10..fc9e6e3  master     -> origin/master
Updating 4091e10..fc9e6e3
Fast-forward
 audit.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
  File "./audit.py", line 132
    connect.set_option(ldap.OPT_REFERRALS, 0)
          ^
SyntaxError: invalid syntax

Это нормально?

 , ,

constin
()

zfs snapshot разжуйте плз

Форум — Admin

Хочу понять , как оно работает.

Вот есть у меня блок информации

[0][0][1][1][0]

я делаю снепшот @snap1, его размер 0, так как он ничем не отличается от состояния системы.

дальше я меняю состояние системы , пишу в первый блок 1 вместо 0

[1][0][1][1][0]

и делаю снепшот @snap2

он тоже размером 0, так как он ничем не отличается от состояния системы.

но что в этот момент происходит с первым снепшотом? он ведь уже отличается от состояния системы. Выходит , что zfs меняет первый снепшот? А если я его экспортировал в файл?

Еще интереснее, если я делаю много итераций , при каждое итерации делаю инкрементый снепшот от последнего и затем удаляю пару промежуточных. Zfs будет менять те снепшоты, что остались в хвосте?

Прежде чем запустить эту магию в продакшен, а хочу точно знать как оно работает. Мне не нужно магии в продакшене :)

 ,

constin
()

python как вставить переменную в декоратор

Форум — Development

Привет, есть вот такой шаблон

def log_in_out(func):

    def decorated_func(*args, **kwargs):
        print("Enter ", func.__name__)
        result = func(*args, **kwargs)
        print("Leave ", func.__name__)
        return result

    return decorated_func

@log_in_out
def my_function():
    print("Inside my_function")
    return 42


val = my_function()

print(val)

Который выдает соответственно

Enter  my_function
Inside my_function
Leave  my_function

я бы хотел, чтобы вместо текста Enter my_function и Leave my_function он показывал переменные, да еще и в одну строчку, но первую перед выполнением функции, а вторую после. Я не знаю как и туда их засунуть.

те я вызываю функцию и передаю или декоратору переменную message , а декоратор делает вот так:

message="Start something" 
вызвали функцию с декоратором

print(message,'.'*(60-len(message)), end = '')
тут  выполняем код функции  и она отдает еще код ошибки p.returncode
print('Error') if p.returncode else print('Done')

в результате я хочу иметь такой вывод:

Start something........ Done
или 
Start something........ Error

Простите, что там сумбурно.

 ,

constin
()

python запуск команды в терминале.

Форум — Development

Решил я переписать для тренировки и изучения питона кучу баш скриптов в питон.

И есть у меня одна проблема. Очень часто в моих баш скриптах есть команды терминала. И они настолько разнообразные, что никакого единого подхода питоном к ним нет. А зачастую и вообще можно только запустить bash код из Питона.

В связи с этим я решил, что почти все команды буду запускать саб процессом из питона.

Но и тут меня встретила жопа с тем, что мне нормально не отловить вывод команды или ее ошибку переменную или в print.

os.system - не отлавливает ошибки subprocess.check_output - не тоже не отдает то ли ошибку,то ли вывод.

Единственное, что более менее работает это

p = Popen(command)
p = Popen(cmd, stdout=subprocess.PIPE,stderr=PIPE,shell=True,
		universal_newlines=True)
	output, error = p.communicate()

но и тут проблемы.

Если я делаю return, то не вижу вывода и должен делать x=function_name(cmd) print(x)

А если я делаю print , то не могу засунуть output в переменную.

В результате у меня родилась уродливая по моему мнению функция, в которую помимо команды я вынужден запихивать метод, корым она мне будет отдавать stdout.

вот она:

def run_command(cmd,output="print",exit_on_error=False):
	p = Popen(cmd, stdout=subprocess.PIPE,stderr=PIPE,shell=True,
		universal_newlines=True)
	o, e = p.communicate()
	if p.returncode != 0:
		if output == "print" : print("%s%s" % (o, e))
		if exit_on_error:
			print("Error. Exit script")
			quit()
		if output == "return": return("%s%s" % (o, e))
	else:
		if output == "return": return("%s%s" % (o, e))
		print("%s%s" % (o, e))

И если я хочу вывод на экран, то

cmd='команда'
run_command(cmd,"print")

А если я хочу вывод в переменную, то

cmd='команда'
x=run_command(cmd,"return")

В если я хочу выйти из скрипта при ошибке, то

run_command(cmd, "print", True)

Тогда как в баше, я получаю вывод в переменную или на экран в зависимости от того просто я запуская команды или запускаю ее в переменную.

Например:

last_remote=$(ssh $backup_ip "/sbin/zfs list -t snapshot -o name | grep "$remote_dataset""@""$type" | sort -r | head -1")

или просто 

$(ssh $backup_ip "/sbin/zfs list -t snapshot -o name | grep "$remote_dataset""@""$type" | sort -r | head -1")

И не важно вернется команда с ошибкой или нет, я могу отловить и статус и текст и сделать это очень просто.

Вопрос, вот эта моя уродливая функция: так все мучаются? или есть нормальное решение?

 , , ,

constin
()

не могу закрыть luks

Форум — Admin

cryptsetup luksFormat -c aes-xts-plain64 -s 256 -h sha256 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 
cryptsetup luksOpen /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 luks1
zpool create lpool /dev/mapper/luks1
touch /lpool/test
cryptsetup luksClose luks1
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
device-mapper: remove ioctl on luks1  failed: Device or resource busy
Device luks1 is still in use.

 , ,

constin
()

zfs backup на remote шифрованый диск

Форум — Admin

Привет. Задача такая: есть zpool , который я будут синхронизировать ssh send/receive на внешний сервер.

Внешний сервер должен иметь шифрованные диски. Но при этом эти диски не должны быть замаунчены все время. Они должны монтироваться только на время синхронизации.

Ну и еще на систему можно поставить inotify и мониторить любые изменения в /. Так что если кто-то поставил систему раком и ставит руткиты, чтобы отснифить ключ маунта, который передается при send/receive , то я успеваю автоматически остановить/отменить следующую синхронизацию и примуанчивание дисков.

Есть какие-то готовые решения/мысли?

Или может я херню вообще написал и есть best practice по этому поводу?

 , , , ,

constin
()

lxd 50-cloud-init.yaml static ip

Форум — Admin

Привет, как бы мне в lxd нормально прописывать статик IP и гейт в /etc/netplan/50-cloud-init.yaml lxc контейнера?

В Proxmox я пишу это в конфиг виртуалки ( через веб или руками) и оно при запуске изменяет этот файл. В LXD я пока только руками лезу в lxc и там его меняю. мне нужна команда типа

lxc set containername cloudinit IP 192.168.0.100/24 gateway 192.168.0.1

или как это делают нормальные люди?

 ,

constin
()

nginx lua os.execute WAIT

Форум — Admin

Привет

location /test{
	    default_type text/plain;
	    content_by_lua '
	    os.execute("/tmp/test.sh")
	    ngx.sleep(20)
	    return ngx.redirect("/")';
	}

Как заставить ждать не 20 секунд, как в примере, а ждать полного исполнения команды /tmp/test.sh ? У меня исполнение скрипта идет около минуты.

 ,

constin
()

питонщики, помогите избавиться от нагромождения строк.

Форум — Development
result=[('uid=canscan,cn=mail,cn=users,dc=domain,dc=localnet', {'mailPrimaryAddress': ['canscan@domain.com']})]

из этого мне надо получить canscan.

Я Питоне как корова на льду, и вот какой п-ц у меня получился.

                       if result:


                                send_as_uid = result[0][0]
                                send_as_uid = send_as_uid.split(',')
                                send_as_uid = str(send_as_uid[0])
                                send_as_uid = send_as_uid.split('=')
                                send_as_uid = str(send_as_uid[1])
                                debug("send_as_uid=%r", send_as_uid)

output:

send_as_uid='canscan'

наверно можно это сделать покороче?:)

 

constin
()

html2base64

Форум — Admin

Простите, наверно надо искать форум вебмакак, но у меня несколько сигнатур(подписей в почте) в виде html с картинками в виде файлов. И хочется чем-нибудь из консоли отгенерить все это в html с картинками в base64. Те не отдельно картинки, а сразу html файл. Можно, конечно, сесть и накидать парсер самому, но вдруг уже есть?

 

constin
()

Ubuntu/gnome изменить параметры sendto/mailto

Форум — Desktop

Привет.

Где в ubuntu18 gnome прописаны возможные варианты для дефолтного почтового приложения? У меня есть приложение и мне надо его туда впихнуть, чтобы пользователь смог его выставить по умолчанию.

просмотрел для примера pre/post scrips у gnome-gmail.deb, который по идее интегрируется после установки. Но ничего похожего не нашел.

есть /usr/share/applications/deskapp_mailto.desktop с

...
Icon=kopano-deskapp
Terminal=false
Type=Application
StartupNotify=true
MimeType=x-scheme-handler/mailto
NoDisplay=true


но это не помогает.

 , ,

constin
()

запретить пользователем писать пользователю в его же папку

Форум — Admin

Очень тупой вопрос.

Допустим, есть /home/testuser/folder 777 (она может быть tmpfs), владелец testuser:Domain users

В процессе логина пользователя, там создаются различные sub folders от имени пользователя. Те в процессе логина мне надо чтобы у пользователя были права на запись. А вот затем надо как-то это запретить. sudo/root использовать нельзя, так как скрипт логина работает от юзера.

chmod u+r,g+r,o+r /home/testuser/folder не срабатывает почему-то.

 

constin
()

Показывает только font family/проблемы с шрифтами.

Форум — Desktop

Не знаю, как это нормально описать. Но, допустим, я установил 2 шрифта (ДВА ФАЙЛА!) семейства Futura PT, Futura PT Heavy и Futura PT Denim. Имена шрифтов значения не имеет, тоже самое будет происходить с любыми другими шрифтами;

Так вот libreoffice или Thunderburd показывают мне при выборе шрифта только Future PT. Причем этим шрифтом по факту будет являться один из этих двоих файлов либо Heavy либо Denim.

В libreoffice можно залезть в Styles ---> Edit style и там оно покажет все шрифты вместе с именами. И даже можно выбрать конкретно Futura PT Denim и что-то им написать. Но если этот текст открыть другим пользователем на этой же машине, то либреофис покажет, что этот шрифт (Futura PT Denim) не установлен.

Это все в немецком интерфейсе. Если пойти в настройки Tools->Options----> Language settings-->Languages----> Locale settings и выбрать там English ( это не настройки интерфейса, это настройки локали) , то хоп и либроофис начинает нормально показывать полное имя шрифта. ты в выпадающем меню будет и Futura PT Heavy и Futura PT Denim.

Вроде как костыль, но можно было бы его сделать и успокоится. но такая же хрень в Thunderbird.

 , ,

constin
()

RSS подписка на новые темы